// 抽象类和抽象方法

// 抽象类使用 abstract 修饰
abstract class Animal {
    public name: string ;
    // 构造函数
    constructor( name: string ){
        this.name = name ;
    } 
    // 抽象方法
    abstract eat( food: string ): void 
    // 具体方法(非抽象方法)
    toString(): string{
        return `${this.constructor.name } { name: '${this.name}' }`;
    }
}

// 不能直接创建抽象类的实例
// let a = new Animal( '熊猫' );

// 使用抽象类继承抽象类时，可以不实现父类抽象方法
abstract class Beast extends Animal {
    constructor( name: string ){
        super( name );
    }
}

// 用具体类(非抽象类)来继承抽象类
class Bear extends Beast {
    constructor( name: string ){
        super( name );
    }
    // 实现抽象父类中的抽象方法
    eat( food: string ): void{
        console.log( `${this.name}吃${food}` );
    }
}

let b = new Bear( '熊二' );
console.log( b );
b.eat( '蜂蜜' );
console.log( b.toString() );

// 总结:
// 抽象类的特点
// 抽象方法的特点
// 抽象方法和非抽象方法的区别
// 抽象类与非抽象类的区别